home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / util / gnu / oleo_src.lha / src / popen.c < prev    next >
C/C++ Source or Header  |  1992-07-27  |  2KB  |  97 lines

  1. #include <stdio.h>
  2. #include "popen.h"
  3. #include <io.h>
  4. #include <string.h>
  5. #include <process.h>
  6.  
  7. typedef enum { unopened = 0, reading, writing } pipemode;
  8. static
  9. struct {
  10.     char *command;
  11.     char *name;
  12.     pipemode pmode;
  13. } pipes[OPEN_MAX];
  14.  
  15. extern void free();
  16.  
  17. FILE *
  18. popen(command,mode )
  19. char *command;
  20. char *mode;
  21. {
  22.     FILE *current;
  23.     char *name;
  24.     int cur;
  25.     pipemode curmode;
  26.     /*
  27.     ** decide on mode.
  28.     */
  29.     if(strcmp(mode,"r") == 0)
  30.         curmode = reading;
  31.     else if(strcmp(mode,"w") == 0)
  32.         curmode = writing;
  33.     else
  34.         return NULL;
  35.     /*
  36.     ** get a name to use.
  37.     */
  38.     if((name = tmpnam(0))==NULL)
  39.         return NULL;
  40.     /*
  41.     ** If we're reading, just call system to get a file filled with
  42.     ** output.
  43.     */
  44.     if(curmode == reading) {
  45.         char cmd[256];
  46.         sprintf(cmd,"%s > %s",command,name);
  47.         system(cmd);
  48.         if((current = fopen(name,"r")) == NULL)
  49.             return NULL;
  50.     } else {
  51.         if((current = fopen(name,"w")) == NULL)
  52.             return NULL;
  53.     }
  54.     cur = fileno(current);
  55.     pipes[cur].name = name;
  56.     pipes[cur].pmode = curmode;
  57.     pipes[cur].command = strdup(command);
  58.     return current;
  59. }
  60.  
  61. int
  62. pclose(current)
  63. FILE *current;
  64. {
  65.     int cur = fileno(current),rval;
  66.     /*
  67.     ** check for an open file.
  68.     */
  69.     if(pipes[cur].pmode == unopened)
  70.         return -1;
  71.     if(pipes[cur].pmode == reading) {
  72.         /*
  73.         ** input pipes are just files we're done with.
  74.         */
  75.         rval = fclose(current);
  76.         unlink(pipes[cur].name);
  77.     } else {
  78.         /*
  79.         ** output pipes are temporary files we have
  80.         ** to cram down the throats of programs.
  81.         */
  82.         char command[256];
  83.         fclose(current);
  84.         sprintf(command,"%s < %s",pipes[cur].command,pipes[cur].name);
  85.         rval = system(command);
  86.         unlink(pipes[cur].name);
  87.     }
  88.     /*
  89.     ** clean up current pipe.
  90.     */
  91.     pipes[cur].pmode = unopened;
  92.     free(pipes[cur].name);
  93.     free(pipes[cur].command);
  94.     return rval;
  95. }
  96.  
  97.